import { ParsecClientEventType, ParsecKeycode, ParsecKeymod, ParsecMessageType, ParsecMouseButton } from './Enums'


/**
 * 日期：2025/7/15
 */
/**
 * 鼠标按键消息
 */
export interface ParsecMouseButtonMessage {
  button: ParsecMouseButton
  pressed: boolean
}

/**
 * 鼠标移动消息
 */
export interface ParsecMouseMotionMessage {
  x: number ///< 如果 `relative` 为 `false`，则为光标在屏幕上的绝对水平坐标；如果 `relative` 为 `true`，则为增量值（可以为负）。
  y: number ///< 如果 `relative` 为 `false`，则为光标在屏幕上的绝对垂直坐标；如果 `relative` 为 `true`，则为增量值（可以为负）。
  relative: boolean ///< `true` 表示相对模式，`false` 表示绝对模式。详见详细说明。
  scaleRelative?: boolean ///< 如果相对坐标应在内部缩放到主机的尺寸，则为 `true`。
  stream?: number; ///< 视频流索引。必须小于 2。
}

/**
 * 鼠标滚轮消息
 */
export interface ParsecMouseWheelMessage {
  x: number;
  y: number;
}

/**
 * 键盘消息
 */
export interface ParsecKeyboardMessage {
  code: ParsecKeycode;
  mod: ParsecKeymod;
  pressed: boolean;
}

export type ParsecMessage<T> = T & {
  type: ParsecMessageType;
};


// --------------------------


export interface ParsecClientCursorEvent {
  cursor?: ParsecCursor ///< 光标属性。
  key?: number ///< 用于检索光标图像的缓冲区查找键，若图像可用。
}

export interface ParsecCursor {
  size?: number; ///< 光标图像缓冲区的大小（以字节为单位）。
  positionX?: number; ///< 退出相对模式时，光标重新出现位置的屏幕水平坐标。
  positionY?: number; ///< 退出相对模式时，光标重新出现位置的屏幕垂直坐标。
  width?: number; ///< 光标图像的宽度（以像素为单位）。
  height?: number; ///< 光标图像的高度（以像素为单位）。
  hotX?: number; ///< 光标热点在图像内的水平像素位置。
  hotY?: number; ///< 光标热点在图像内的垂直像素位置。
  hidden?: boolean; ///< 若主机上的鼠标光标已隐藏，则为 `true`。
  imageUpdate?: boolean; ///< 若应更新光标图像，则为 `true`。此时 `width`、`height`、`hotX`、`hotY` 和 `size` 成员有效。
  relative?: boolean; ///< 若处于相对模式，则为 `true`，这意味着客户端应提交鼠标相对移动距离，而非绝对屏幕坐标。
  stream?: number; ///< 视频流索引。必须小于 ::NUM_VSTREAMS。
}

export type ParsecClientEvent<T = Object> = T & {
  type?: ParsecClientEventType;
};